package models.dados;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import play.db.jpa.Model;

import models.Administrador;
import models.Cliente;
import models.Cliente;
import models.Donut;
import models.Endereco;
import models.Pedido;
import models.Produto;
import models.TipoUsuario;
import models.Usuario;

public class BancoTeste extends Model implements DAO {

	private static List<Cliente> clientesCadastrados;
	private static List<Cliente> clientesNaoCadastrado;
	private static List<Administrador> administradores;
	private static List<Pedido> pedidos;
	private static List<Produto> produtos;

	private static BancoTeste unicaInstancia;

	private BancoTeste() {

		carregarClientes();
		carregarAdministradores();
		carregarDonuts();
		carregarPedidos();

	}

	public static DAO getInstancia() {
		if (unicaInstancia == null) {
			unicaInstancia = new BancoTeste();
			return unicaInstancia;
		}
		return unicaInstancia;
	}

	@Override
	public Cliente getClienteCadastrado(String nomeUsuario)
			throws DadoNaoEncontradoException {

		for (int i = 0; i < clientesCadastrados.size(); i++) {
			if ((clientesCadastrados.get(i)).getNomeUsuario().equals(
					nomeUsuario)) {
				return clientesCadastrados.get(i);
			}
		}
		throw new DadoNaoEncontradoException();

	}

	@Override
	public Cliente getClienteNaoCadastrado(String nome) {
		return null;
	}

	@Override
	public Administrador getAdministrador(String nomeUsuario)
			throws DadoNaoEncontradoException {
		Administrador usuario = (Administrador) this.getUsuario(nomeUsuario,
				this.administradores);
		if (usuario == null) {
			throw new DadoNaoEncontradoException();
		}
		return usuario;
	}

	// Em breve um excessão aki
	@Override
	public Pedido getPedido(long numero) throws DadoNaoEncontradoException {
		for (int i = 0; i < pedidos.size(); i++) {
			if (pedidos.get(i).getNumero() == (numero)) {
				

				return pedidos.get(i);
			}
		}
		throw new DadoNaoEncontradoException();
	}

	@Override
	public void inserirCliente(Cliente cliente) throws ChaveRepetidaException {
		Cliente cl = (Cliente) cliente;
		if (cl.getNomeUsuario() == null) {
			this.clientesNaoCadastrado.add((Cliente) cliente);
		} else {
			for (int i = 0; i < clientesCadastrados.size(); i++) {
				if (clientesCadastrados.get(i).getNomeUsuario()
						.equals((Cliente) cliente)) {
					throw new ChaveRepetidaException();
				}

			}
			clientesCadastrados.add((Cliente) cliente);
		}

	}

	@Override
	public void inserirPedido(Pedido pedido) {
		this.pedidos.add(pedido);

	}

	@Override
	public void inserirAdministrador(Administrador administrador)
			throws ChaveRepetidaException {
		for (int i = 0; i < this.administradores.size(); i++) {
			if (administradores.get(i).getNomeUsuario()
					.equals(administrador.getNomeUsuario())) {
				throw new ChaveRepetidaException();

			}
		}
		administradores.add(administrador);

	}

	@Override
	public void inserir(Produto produto) throws ChaveRepetidaException {
		for (int i = 0; i < this.produtos.size(); i++) {
			if (produto.getNome().equals(produtos.get(i).getNome())) {
				throw new ChaveRepetidaException();

			}
		}
		this.produtos.add(produto);
	}

	@Override
	public void removerCliente(String nomeUsuario)
			throws DadoNaoEncontradoException {
		for (int i = 0; i < this.clientesCadastrados.size(); i++) {
			if (clientesCadastrados.get(i).getNomeUsuario().equals(nomeUsuario)) {
				clientesCadastrados.remove(i);

			}
		}
		throw new DadoNaoEncontradoException();

	}

	@Override
	public void removerPedido(Pedido pedido) throws DadoNaoEncontradoException {
		this.alterarPedido(pedido);

	}

	@Override
	public void removerAdministrador(String nomeUsuario)
			throws DadoNaoEncontradoException {
		// TODO Auto-generated method stub

	}

	@Override
	public void removerProduto(String tipo, String marca, String nome)
			throws DadoNaoEncontradoException {
		for (int i = 0; i < produtos.size(); i++) {
			if (produtos.get(i).getNome().equals(nome)) {
				produtos.remove(i);
				break;
			}
		}
		throw new DadoNaoEncontradoException();

	}

	@Override
	public void alterarCliente(Cliente cliente) {
		int idx = -1;
		for (int i = 0; i < clientesCadastrados.size(); i++) {
			if (this.clientesCadastrados.get(i).getNomeUsuario()
					.equals(cliente.getNomeUsuario())) {
				idx = i;
				break;
			}
		}
		clientesCadastrados.set(idx, cliente);
		System.out.println(idx);

	}

	@Override
	public void alterarPedido(Pedido pedido) {
		for (int i = 0; i < this.pedidos.size(); i++) {
			if (pedido.getNumero() == (pedidos.get(i).getNumero())) {
				pedidos.set(i, pedido);
				break;
			}
		}

	}

	@Override
	public void alterarAdministrador(Administrador administrador) {
		for (int i = 0; i < administradores.size(); i++) {
			if (administradores.get(i).getNomeUsuario()
					.equals(administrador.getNomeUsuario())) {
				administradores.set(i, administrador);
				break;
			}
		}

	}

	@Override
	public void alterarProduto(Produto produto) {
		for (int i = 0; i < this.produtos.size(); i++) {
			if (produtos.get(i).getNome().equals(produto.getNome())) {
				produtos.set(i, produto);
				break;
			}
		}

	}

	@Override
	public Produto getProduto(String nome) throws DadoNaoEncontradoException {
		for (int i = 0; i < produtos.size(); i++) {
			if (produtos.get(i).getNome().equals(nome)) {
				return produtos.get(i);
			}
		}
		throw new DadoNaoEncontradoException();
	}




	@Override
	public List<Produto> listarProdutos() {
		return this.produtos;
	}

	@Override
	public List<Produto> listarProdutos(String tipo) {
		List<Produto> p = new ArrayList<Produto>();
		for (int i = 0; i < produtos.size(); i++) {
			if (produtos.get(i).getTipo().equals(tipo)) {
				p.add(produtos.get(i));
			}
		}
		return p;
	}



	private void carregarClientes() {

		clientesCadastrados = new ArrayList<Cliente>();
		clientesNaoCadastrado = new ArrayList<Cliente>();

		Endereco endereco1 = new Endereco("Praia de Muriu", 123,
				"Nova Parnamirim", "CD Andorra", "00000-00", "5555-5555");
		Endereco endereco2 = new Endereco("Praia de Muriu", 123, "Ponta Negra",
				"", "00000-00", "8841-8987");
		Endereco endereco3 = new Endereco("Rua Mossoro", 123, "Tiro", "",
				"00000-00", "5555-5555");
		Endereco endereco4 = new Endereco("Bernado Vieira", 123, "Tirol", "",
				"00000-00", "6585-9745");
		Endereco endereco5 = new Endereco("Av. Ayrton Senna", 123,
				"Nova Parnamirim", "Padaria Ki-Pao", "00000-00", "9745-5555");
		Endereco endereco6 = new Endereco("Abel Cabral", 4585,
				"Nova Parnamirim", "Shopping Ayrton Senna", "00000-00",
				"5555-5555");

		Cliente cliente1 = new Cliente("Andre", "als_soares@hotmail.com",
				endereco1, endereco2, "andre", "12345", true, false, 0,
				TipoUsuario.CLIENTE);
		Cliente cliente2 = new Cliente("Guilherme", "gulherme@hotmail.com",
				endereco2, endereco3, "guilherme", "22222", true, false, 0,
				TipoUsuario.CLIENTE);
		Cliente cliente3 = new Cliente("Marcos", "marcos@hotmail.com",
				endereco3, endereco4, "marcos", "33333", true, false, 0,
				TipoUsuario.CLIENTE);
		Cliente cliente4 = new Cliente("Ana", "ana@hotmail.com", endereco4,
				endereco5, "ana", "44444", true, false, 0, TipoUsuario.CLIENTE);
		Cliente cliente5 = new Cliente("Jose", "jose@hotmail.com", endereco5,
				endereco6, "jose", "55555", true, false, 0, TipoUsuario.CLIENTE);
		Cliente cliente6 = new Cliente("Leonardo", "leonardo@hotmail.com",
				endereco6, endereco1, "leonardo", "00000", true, false, 0,
				TipoUsuario.CLIENTE);

		clientesCadastrados.add(cliente1);
		clientesCadastrados.add(cliente2);
		clientesCadastrados.add(cliente3);
		clientesCadastrados.add(cliente4);
		clientesCadastrados.add(cliente5);
		clientesCadastrados.add(cliente6);

	}

	private void carregarAdministradores() {
		administradores = new ArrayList<Administrador>();
		Administrador admDefault = new Administrador("super", "12345", true,
				false, 3, TipoUsuario.ADM_SUPER, "super");
		Administrador adm1 = new Administrador("vendas", "54321", true, false,
				3, TipoUsuario.ADM_VENDAS, "super");
		Administrador adm2 = new Administrador("web", "00000", true, false, 3,
				TipoUsuario.ADM_WEB, "super");

		administradores.add(admDefault);
		administradores.add(adm1);
		administradores.add(adm2);
	}

	private void carregarDonuts() {
		Donut donut1 = new Donut("Donut", "chocolate", 1.10,
				"/public/images/donuts/choco1.png", new GregorianCalendar(2011,
						2, 20), "default");
		Donut donut2 = new Donut("Donut", "morango", 1.25,
				"/public/images/donuts/morango2.png", new GregorianCalendar(
						2008, 5, 7), "default");
		Donut donut3 = new Donut("Donut", "limao", 1.36,
				"/public/images/donuts/morango3.png", new GregorianCalendar(
						2011, 12, 8), "default");
		Donut donut4 = new Donut("Donut", "laranja", 1.48,
				"/public/images/donuts/morango4.png", new GregorianCalendar(
						2010, 12, 8), "default");
		Donut donut5 = new Donut("Donut", "pessego", 1.99,
				"/public/images/donuts/morango5.png", new GregorianCalendar(
						2010, 12, 8), "default");
		Donut donut6 = new Donut("Donut", "coco", 5.31,
				"/public/images/donuts/morango6.png", new GregorianCalendar(
						2010, 9, 18), "default");

		produtos = new ArrayList<Produto>();
		produtos.add(donut1);
		produtos.add(donut2);
		produtos.add(donut3);
		produtos.add(donut4);
		produtos.add(donut5);
		produtos.add(donut6);

	}

	private void carregarPedidos() {

		this.pedidos = new ArrayList<Pedido>();

		Pedido pedido1 = new Pedido(clientesCadastrados.get(0),
				new GregorianCalendar(2010, 12, 25), null, 1, "visto");
		pedido1.setAlteradoPor("super");
		pedido1.adicionarProduto(produtos.get(0), 200);
		pedido1.adicionarProduto(produtos.get(1), 200);
		pedido1.adicionarProduto(produtos.get(2), 200);
		pedido1.adicionarProduto(produtos.get(3), 200);

		Pedido pedido2 = new Pedido(clientesCadastrados.get(1),
				new GregorianCalendar(2010, 8, 13), null, 2, "enviado");

		pedido2.setAlteradoPor("super");
		pedido2.adicionarProduto(produtos.get(2), 20);
		pedido2.adicionarProduto(produtos.get(3), 15);
		pedido2.adicionarProduto(produtos.get(4), 30);

		Pedido pedido3 = new Pedido(clientesCadastrados.get(3),
				new GregorianCalendar(2011, 7, 9), null, 3, "enviado");
		pedido3.setAlteradoPor("vendas");

		pedido3.adicionarProduto(produtos.get(0), 2);
		Pedido pedido4 = new Pedido(clientesCadastrados.get(4),
				new GregorianCalendar(2011, 11, 16), null, 4, "pendente");
		pedido3.adicionarProduto(produtos.get(2), 2);
		pedido3.adicionarProduto(produtos.get(3), 5);
		pedido3.adicionarProduto(produtos.get(4), 2);

		pedido4.setAlteradoPor("vendas");

		/*
		 * this.pedidos.add(pedido1); this.pedidos.add(pedido2);
		 * this.pedidos.add(pedido3); this.pedidos.add(pedido4);
		 */

	}

	private Usuario getUsuario(String nomeUsuario, List lista) {
		for (int i = 0; i < lista.size(); i++) {
			Usuario usuario = (Usuario) lista.get(i);
			if (usuario.getNomeUsuario().equals(nomeUsuario)) {
				return usuario;
			}
		}
		return null;

	}

	@Override
	public void removerProduto(String nome) {
		// TODO Auto-generated method stub

	}





	@Override
	public List<Pedido> listarPedidos(long numero, String usuarioCliente,
			String nomeCliente, GregorianCalendar dataExata,
			GregorianCalendar dataInicial, GregorianCalendar dataFinal,
			String status, String usuarioUltimaAlteracao,GregorianCalendar dataUltimaAlteracao) {
		List<Pedido> result = new ArrayList<Pedido>();
		int i=0;
		return this.pedidos;
		
		
		
	 
	}

	@Override
	public List<Administrador> listarAdministradores(String usuario,
			TipoUsuario tipo, String cadastradoPor, Calendar DataCadastro,
			boolean bloqueado,boolean naoBloqueado,boolean ativo,boolean anoAtivo) {
		return this.administradores;
	}

	@Override
	public List<Cliente> listarClientes(String nomeUsuario, String nome,
			Calendar dataCadastro,Calendar dataCadastroInicial,Calendar dataCadastroFinal, boolean bloqueado,boolean naoBloqueado, boolean ehCadastrado,boolean naoCadastrado) {
	//	return this.clientesCadastrados;
		ArrayList<Cliente> c1 = (ArrayList<Cliente>) this.clientesCadastrados;
		ArrayList<Cliente> c2 = (ArrayList<Cliente>) this.clientesNaoCadastrado;
		ArrayList<Cliente> c3 = new ArrayList<Cliente>();
		for(int i=0;i < c1.size();i++){
			c3.add(c1.get(i));
		}
		for(int i=0;i < c2.size();i++){
			c3.add(c2.get(i));
		}
		return c3;
	}

}
